﻿// using System.Linq.Dynamic.Core;
// using System.Linq.Dynamic.Core.Parser;
// using System.Linq.Dynamic.Core.Tokenizer;
// using System.Linq.Expressions;
//
// namespace FreeSqlTest;
//
// public class ExpressionParser
// {
//     //字符串解析器的配置,比如区分大小写、是否自动解析类型、自定义类型解析器等
//     private readonly ParsingConfig _parsingConfig;
//
//     //查找指定类型中的方法信息,通过反射获取MethodInfo
//     private readonly MethodFinder _methodFinder;
//
//     //用于帮助解析器识别关键字、操作符和常量值
//     private readonly IKeywordsHelper _keywordsHelper;
//
//     //解析字符串表达式中的文本,用于从字符串中读取字符、单词、数字等
//     private readonly TextParser _textParser;
//
//     //解析字符串表达式中的数字,用于将字符串转换为各种数字类型
//     private readonly NumberParser _numberParser;
//
//     //用于帮助生成和操作表达式树
//     private readonly IExpressionHelper _expressionHelper;
//
//     //用于查找指定名称的类型信息
//     private readonly ITypeFinder _typeFinder;
//
//     //用于创建类型转换器
//     private readonly ITypeConverterFactory _typeConverterFactory;
//
//     //用于存储解析器内部使用的变量和选项。这些变量和选项不应该由外部代码访问或修改
//     private readonly Dictionary<string, object> _internals = new();
//
//     //用于存储字符串表达式中使用的符号和值。例如，如果表达式包含 @0 占位符，则可以使用 _symbols["@0"] 访问其值。
//     private readonly Dictionary<string, object?> _symbols;
//
//     //表示外部传入的参数和变量。如果表达式需要引用外部的参数或变量，则应该将它们添加到 _externals 中。
//     private IDictionary<string, object>? _externals;
//
//     /// <summary>
//     /// 使用TextParser将字符串解析为指定的结果类型.
//     /// </summary>
//     /// <param name="resultType"></param>
//     /// <param name="createParameterCtor">是否创建带有相同名称的构造函数</param>
//     /// <returns>Expression</returns>
//     public Expression Parse(Type? resultType, bool createParameterCtor = true)
//     {
//         _resultType = resultType;
//         _createParameterCtor = createParameterCtor;
//
//         int exprPos = _textParser.CurrentToken.Pos;
//         //解析条件运算符表达式
//         Expression? expr = ParseConditionalOperator();
//         //将返回的表达式提升为指定类型
//         if (resultType != null)
//         {
//             if ((expr = _parsingConfig.ExpressionPromoter.Promote(expr, resultType, true, false)) == null)
//             {
//                 throw ParseError(exprPos, Res.ExpressionTypeMismatch, TypeHelper.GetTypeName(resultType));
//             }
//         }
//         //验证最后一个标记是否为 TokenId.End，否则抛出语法错误异常
//         _textParser.ValidateToken(TokenId.End, Res.SyntaxError);
//
//         return expr;
//     }
//
//     // ?: operator
//     private Expression ParseConditionalOperator()
//     {
//         int errorPos = _textParser.CurrentToken.Pos;
//         Expression expr = ParseNullCoalescingOperator();
//         if (_textParser.CurrentToken.Id == TokenId.Question)
//         {
//            ......
//         }
//         return expr;
//     }
//
//     // ?? (null-coalescing) operator
//     private Expression ParseNullCoalescingOperator()
//     {
//         Expression expr = ParseLambdaOperator();
//         ......
//         return expr;
//     }
//     // => operator - Added Support for projection operator
//     private Expression ParseLambdaOperator()
//     {
//         Expression expr = ParseOrOperator();
//         ......
//         return expr;
//     }
//
// }
